package com.wolfking.sharding.seq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 使用数据库实现分布式高效的 sequence
 * <p>
 * 每次递增固定的步长，缓存再内存中使用
 * <P>，
 * 需要使用的时候从数据库获取
 * <p>
 * 使用cas+自旋的无锁实现，getUserPayNextId方法不使用synchronized或者lock实现，
 * <p>
 * 经过测试使用synchronized或者lock，性能指数级别下降
 * <p>
 * 只在从数据库获取底层固定步长的时候，使用 synchronized + double check 实现
 * <p>
 * step不宜设置过大，不然数据库的ID会有部分不连续的情况，数显数据分列，推荐使用100-1000之间，默认1000
 * <p>
 * 根据并发领随时调整step
 *
 * @author wollfking(赵伟伟)
 * @email zww199909@163.com
 * @mobile new String(Base64.getDecoder().decode("MTc2MDA2OTgzNzUKIA=="), StandardCharsets.UTF_8)
 */
@Slf4j
@Service
public class UserGatherSeqService extends AbstractTableSeqService {

    @Override
    protected int getStepSize() {
        return 1;
    }


    @Override
    protected String getTableName() {
        return "user_gather";
    }
}
